<?php
class Upload
{
    protected $fileName;
    protected $maxSize;
    protected $allowExt;
    protected $allowMine;
    protected $uploadPath;
    protected $imgFlag;
    protected $fileInfo;
    protected $error;
    protected $ext;
    
    
    public function __construct($uploadPath='up',$maxSize=5242880,
    $allowExt=array('jpeg','png','gif'),$fileName='myfile',
    $allowMine=array('image/jpeg','image/png','image/gif'),$imgFlag=true)
    {
        $this->fileName=$fileName;
        $this->maxSize=$maxSize;
        $this->allowExt=$allowExt;
        $this->allowMine=$allowMine;        
        $this->uploadPath=$uploadPath;
        $this->imgFlag=$imgFlag;
        $this->fileInfo=$_FILES[$this->fileName];
    }
    //检测上传文件是否有错
    protected function checkError(){
        if(!is_null($this->fileInfo)){
            if($this->fileInfo['error']>0){
                switch($this->fileInfo['error']){
                    case 1:
                        $this->error='超过了PHP配置文件upload_max_filesize的大小';
                        break;
                    case 2:
                        $this->error='超过了表单MAX_FILE_SIZE设置的值';
                        break;
                    case 3:
                        $this->error='文件部分被上传';
                        break;
                    case 4:
                        $this->error='没有选择上传文件';
                        break;
                    case 6:
                        $this->error='没有找到临时目录';
                        break;
                    case 7:
                    case 8:
                        $this->error='系统错误';
                        break;
                }
                return false;
            }else{
                return true;
            }
        }else{
            $this->error='文件上传出错';
            return false;
        }
       
    }

    //上传文件大小检测
    protected function checkSize(){
        if($this->fileInfo['size']>$this->maxSize){
            $this->error='上传文件过大';
            return false;
        }
        return true;
    }
    //上传文件扩展名检测    
    protected function checkExt(){
        $this->ext=strtolower(pathinfo($this->fileInfo['name'],PATHINFO_EXTENSION));
        if(!in_array($this->ext,$this->allowExt)){
            $this->error='不允许的扩展名';
            return false;
        }
        return true;
    }

    //上传文件类型检测     
    protected function checkMine(){
        if(!in_array($this->fileInfo['type'],$this->allowMine)){
            $this->error='不允许的文件类型';
            return false;
        }
        return true;
    }
    //检测是否为真实图片
    protected function checkTrueImg(){
        if($this->imgFlag){
            if(!@getimagesize($this->fileInfo['tmp_name'])){
                $this->error='不是真实图片';
                return false;
            }
            return true;
        }
    }
    //检测是否为上传来的图片
    protected function checkHttp(){
        if(!is_uploaded_file($this->fileInfo['tmp_name'])){
            $this->error='文件不是通过HTTP POST方式上传上来的';
            return false;
        }
        return true;
    }
    //显示错误
    protected function showError(){
        exit('<span style="color:red">'.$this->error.'</span>');
    }

    //检测目录是否存在,不存在则创建
    protected function checkUploadPath(){
        if(!file_exists($this->uploadPath)){
            mkdir($this->uploadPath,0777,true);
        }
    }
    //产生uniName
    protected function getuniName(){
        return md5(uniqid(microtime(true),true));
    }
    //上传文件func
    public function uploadFile()
    {
        if($this->checkError()&&$this->checkSize()&&$this->checkExt()&&$this->checkMine()&&$this->checkTrueImg()&&$this->checkHttp()){
            $this->checkUploadPath();
            $this->uniName=$this->getuniName();
            $this->destination=$this->uploadPath.'/'.$this->uniName.'.'.$this->ext;
            if(@move_uploaded_file($this->fileInfo['tmp_name'],$this->destination)){
                return $this->destination;
            }else{
                $this->error='文件移动失败';
                $this->showError();
            }
        }else{
            $this->showError();
        }
    }
}

                      /*
   o                 /' ) 
                   /'   (                          ,
               __/'     )                        .' `;
o      _.-~~~~'          ``---..__             .'   ;
 _.--'  b)                       ``--...____.'   .'
(     _.      )).      `-._                     <
 `\|\|\|\|)-.....___.-     `-.         __...--'-.'.
   `---......____...---`.___.'----... .'         `.;
                                    `-`           `*/ 